package com.xhg.mqtt;

import com.xhg.mqtt.constant.MqttConstants;
import com.xhg.mqtt.core.MqttSimpleClient;
import com.xhg.mqtt.dto.EventCodeEnum;
import com.xhg.mqtt.dto.MqttConfigInfoDTO;
import com.xhg.mqtt.dto.OnlineStatusPb;
import com.xhg.mqtt.listener.MqttLoggerFactory;
import com.xhg.mqtt.proto.BoxInfoPb;
import com.xhg.mqtt.proto.SiteInfoPb;
import com.xhg.mqtt.templet.Logger;
import com.xhg.mqtt.util.CommonUtil;
import java.util.ArrayList;
import java.util.List;

/**
 * @author E.T
 * @version 1.0
 * @Description
 * @date 2018-08-01 17:01
 * @updateby
 * @updatedate
 * @since 1.0
 */
public class mqttV3 {
    private MqttConfigInfoDTO mqttInfo;
    private MqttSimpleClient client;//mqtt客户端
    public static void main(String[] args) throws Exception{
        mqttV3 v2 =new mqttV3();
        v2.init();
//        v2.login();
//        Thread.sleep(5000);
//        MessageManager.addListener(new MyListener());
//        v2.login2();
        v2.boxinfo();

    }

    private void duan() {
    }

    public void init() {
        mqttInfo = new MqttConfigInfoDTO();
        String version = "1.0";//版本号，自己设定
        //客户端设备自己的一个标记，建议用设备号+版本号进行组合作为客户端id上报 这个一定要是一个唯一的值  每个终端机子app上的clientId都不能相同
        String clientId = "helloword";//自己生成的，具体怎么样看你们的规则，反正就是每个app要唯一，唯一，唯一，重要的事情说三遍
        String userName = "yan1";//接口获取的
        String pwd = "qwe";//接口获取的
//        String[] urls = new String[]{"tcp://10.10.10.213:1883","tcp://10.10.10.214:1883"};//接口获取的
        String[] urls = new String[]{"tcp://10.10.10.214:1883"};//接口获取的
//        String[] urls = new String[]{"tcp://47.96.121.156:1883"};//接口获取的

        List<String> topicsList = new ArrayList<>();//接口获取的
        topicsList.add("hello");//测试用的
        topicsList.add("xhg/hello");//测试用的
        topicsList.add("xhg/hello/ack");//测试用的
        topicsList.add("xhg001/device/+");//全国通用订阅topic
        topicsList.add("xhg001/device/+/{province}");//全省订阅topic  需要将province替换成真是只
        topicsList.add("xhg001/device/+/{province}/{city}");//全市订阅topic 需要将province，city替换成真是只
        topicsList.add("xhg001/device/+/{province}/{city}/{area}");//全区订阅topic 需要将province，ciyt，area替换成真是只
        topicsList.add("xhg001/device/{clientId}/ack");//订阅应答主题，clientid替换成实际的id，服务端的ack回复将会推送到这个topic来，这个topic可以单独订阅
//        topicsList.add("xhg001/server/+/440000000000/441900000000/441900004000");

        String pushTopic = "xhg001/server/{eventCode}/{province}/{city}/{area}"; //接口获取的，这里面的占位符需要根据实际情况替换成具体的值，比如{eventCode}替换成具体的业务code
        String ackTopic = "xhg001/server/{eventCode}/{province}/{city}/{area}/ack"; //接口获取的，这里面的占位符需要根据实际情况替换成具体的值，比如{province}替换成具体的这个终端机所在的省份code
        int authType = 2;//接口获取的，认证方式  0：无认证， 1：证书认证，:2：用户名密码认证

        //注意： 这里只是模拟接口返回回来的mqtt信息
        mqttInfo.setUris(urls);
        mqttInfo.setPushTopic(pushTopic);
        mqttInfo.setAckTopic(ackTopic);
        mqttInfo.setAuthType(authType);
        mqttInfo.setUsername(userName);
        mqttInfo.setPassword(pwd);
        mqttInfo.setProvince("440000000000");//接口获取，后面的topic需要用到，这里随便写一个了 代表广东省
        mqttInfo.setCity("441900000000");//接口获取，终端机所在城市 比如深圳
        mqttInfo.setArea("441900004000");//接口获取，终端机所在区 比如南山区
        mqttInfo.setSubscribeTopics(topicsList);

        try {
            MqttSimpleClient.getInstance().init(mqttInfo,clientId,version);
//            MessageManager.addListener(new MyListener());
            MqttLoggerFactory.createLogger(new Logger());
        }catch (Exception e){
            MqttLoggerFactory.error("连接异常:",e);
        }
    }

    /**
     * 设备上报
     */
    private void login() {
        try {
            String deviceId = "1654345234";//这个就是相当于上面mqtt那个clientId ，唯一的
            String version = "1.0";//版本号，自己设定 全局统一版本号
            Integer cc = Integer.parseInt(CommonUtil.get8BitBinString(1));//控制码，是否需要ack回复0代表不需要，1代表 需要，这个是二进制吗，需要转换成二进制
            //构建业务消息内容
            OnlineStatusPb.OnlineStatus.Builder online = OnlineStatusPb.OnlineStatus.newBuilder();
            online.setStatus(0);
            online.setStatusDesc("设备上线");
            client.pushMessage(EventCodeEnum.DEVICE_LOGIN,deviceId,version,cc,MqttConstants.QOS,online.build().toByteString());
        } catch (Exception e) {
            MqttLoggerFactory.error("上报异常",e);
        }
    }

    /**
     * 设备上报
     */
    private void login2() {
        try {
            String deviceId = "1";//这个就是相当于上面mqtt那个clientId ，唯一的
            String version = "1.0";//版本号，自己设定 全局统一版本号
            Integer cc = Integer.parseInt(CommonUtil.get8BitBinString(1));//控制码，是否需要ack回复0代表不需要，1代表 需要，这个是二进制吗，需要转换成二进制
            //构建业务消息内容
            OnlineStatusPb.OnlineStatus.Builder online = OnlineStatusPb.OnlineStatus.newBuilder();
            online.setStatus(1);
            online.setStatusDesc("ceshi");
            client.pushMessage(EventCodeEnum.DEVICE_LOGIN,deviceId,version,cc,MqttConstants.QOS,online.build().toByteString());
        } catch (Exception e) {
            MqttLoggerFactory.error("异常",e);
        }
    }
    /**
     * 设备上报
     */
    private void boxinfo() {
        try {
            String deviceId = "xhg201801020142";//这个就是相当于上面mqtt那个clientId ，唯一的
            String version = "1.0";//版本号，自己设定 全局统一版本号
            Integer cc = Integer.parseInt(CommonUtil.get8BitBinString(1));//控制码，是否需要ack回复0代表不需要，1代表 需要，这个是二进制吗，需要转换成二进制
            //构建业务消息内容
//            BoxInfoPb.BoxInfo.Builder boxinfo = BoxInfoPb.BoxInfo.newBuilder();
//            BoxInfoPb.BoxStatus.Builder s1 = BoxInfoPb.BoxStatus.newBuilder();
//            s1.setType(1);
//            BoxInfoPb.BoxStatus.Builder s2 = BoxInfoPb.BoxStatus.newBuilder();
//            s2.setType(2);
//            boxinfo.addBoxStatus(s1);
//            boxinfo.addBoxStatus(s2);
            List<Integer> errorCodes = new ArrayList<>();
            errorCodes.add(102);
            errorCodes.add(11);
            errorCodes.add(213);
            BoxInfoPb.BoxStatus.Builder boxStatus = BoxInfoPb.BoxStatus.newBuilder();
            boxStatus.setBoxStatus(1);
            boxStatus.setType(3);
            boxStatus.setExceptStatus(1);
            boxStatus.setLoadRate(0.78);
            boxStatus.setSterilizeStatus(0);
            boxStatus.addAllErrorCode(errorCodes);
            BoxInfoPb.BoxInfo.Builder boxInfo = BoxInfoPb.BoxInfo.newBuilder();
            boxInfo.addBoxStatus(boxStatus);
            client.pushMessage(EventCodeEnum.BOX_INFO,deviceId,version,cc,MqttConstants.QOS,boxInfo.build().toByteString());
        } catch (Exception e) {
            MqttLoggerFactory.error("异常",e);
        }
    }

    /**
     * 站点信息上报
     */
    public void siteInfo(){
        try {
        String deviceId = "xhg201801020";//这个就是相当于上面mqtt那个clientId ，唯一的
        String version = "1.0";//版本号，自己设定 全局统一版本号
        Integer cc = Integer.parseInt(CommonUtil.get8BitBinString(1));//控制码，是否需要ack回复0代表不需要，1代表 需要，这个是二进制吗，需要转换成二进制
        SiteInfoPb.SiteInfo.Builder siteInfo = SiteInfoPb.SiteInfo.newBuilder();
        siteInfo.setRestartTime(System.currentTimeMillis());
        client.pushMessage(EventCodeEnum.SITE_INFO,deviceId,version,cc,MqttConstants.QOS,siteInfo.build().toByteString());
        } catch (Exception e) {
            MqttLoggerFactory.error("异常",e);
        }
    }

}
